package com.example.flow

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.zip
import kotlinx.coroutines.runBlocking

/**
 zip：处理并发接口，不是依赖，全部请求完做统一处理
 场景1：首页使用一个recyclerview展示全部的数据，数据有5个接口拿到数据，并将5个接口数据放在同一个数据源处理展示在recyclerview中
 场景2:我们正在开发一个天气预报应用，需要去一个接口请求当前实时的天气信息，还需要去另一个接口请求未来7天的天气信息。这两个接口之间并没有先后依赖关系，但是却需要两个接口同时返回数据之后再将天气信息展示给用户。

 */


fun main(){
  val list = mutableListOf<String>()
  runBlocking {
   sendRealtimeWeatherRequest()
    .zip(sendSevenDaysWeatherRequest()) { realtimeWeather, sevenDaysWeather ->
        println(realtimeWeather)
        println(sevenDaysWeather)
        list.add(realtimeWeather)
        list.add(sevenDaysWeather)
        list // 返回给下一个zip
    }
    .zip(sendTwoDaysWeatherRequest()){list,twoDaysWeather->
        println(twoDaysWeather)
        list.add(twoDaysWeather)
        list
    }.collect { list ->

     println(list)
    }

  }
}

/**
 * 接口1:获得当天的天气
 */

fun sendRealtimeWeatherRequest(): Flow<String> = flow {
 emit("当天的天气")
}

/**
 * 接口2:获得7天后的天气
 */

fun sendSevenDaysWeatherRequest(): Flow<String> = flow {
 emit("7天后的天气")
}

/**
 * 接口3:获得前2天的天气
 */

fun sendTwoDaysWeatherRequest(): Flow<String> = flow {
 emit("2天前的天气")
}

